package com.zhonghui.common.eshopDozer.config;

import com.zhonghui.common.vo.Paging;
import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

import java.lang.reflect.Array;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Component
@Lazy(true)
public class EJBGenerator implements IGenerator {

    @Autowired
    protected Mapper dozerMapper;

    public EJBGenerator() {
    }

    public <T, S> T convert(final S s, Class<T> clz) {
        return s == null ? null : this.dozerMapper.map(s, clz);
    }

    public <T, S> List<T> convert(List<S> s, Class<T> clz) {
        return s == null ? null : (List)s.stream().map((vs) -> {
            return this.dozerMapper.map(vs, clz);
        }).collect( Collectors.toList());
    }

    public <T, S> Paging<T> convertPaging(Paging<S> paging, Class<T> clz) {
        Paging<T> pagingVo = new Paging();
        pagingVo.setRecords(this.convert(paging.getRecords(), clz));
        pagingVo.setTotal(paging.getTotal());
        return pagingVo;
    }

    public <T, S> Set<T> convert(Set<S> s, Class<T> clz) {
        return s == null ? null : (Set)s.stream().map((vs) -> {
            return this.dozerMapper.map(vs, clz);
        }).collect(Collectors.toSet());
    }

    public <T, S> T[] convert(S[] s, Class<T> clz) {
        if (s == null) {
            return null;
        } else {
            T[] arr = (T[]) Array.newInstance(clz, s.length);

            for(int i = 0; i < s.length; ++i) {
                arr[i] = this.dozerMapper.map(s[i], clz);
            }

            return arr;
        }
    }

}

